package com.haiyou.sdk.rank;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.haiyou.common.entity.Entity;
import com.haiyou.data.common.accessor.NotImplementedException;

/**
 * 
 * 
 * @Description: 排行榜
 * @author xingyuan
 * @date 2022年3月30日 下午7:03:16
 */
public interface Rank<K extends Serializable & Comparable<K>,V>  {

	/**
	 * 排行榜限制数量
	 * @return
	 */
	default int limit() {
		throw new NotImplementedException();
	}
	
	/**
	 * 上榜值条件,最低上榜分数
	 * @return
	 */
	default double minScored() {
		throw new NotImplementedException();
	}
	
	
	/**
	 * 获取最后一个的K
	 * @return
	 */
	default K lastKey() {
		throw new NotImplementedException();
	}
	
	/**
	 * 获取最后一个key的得分
	 * @return
	 */
	default double lastScored() {
		throw new NotImplementedException();
	}
	
	/**
	 * 得分比较
	 * @param v1
	 * @param v2
	 * @return v1 > v2 true
	 */
	default boolean compare(V v1,V v2) {
		throw new NotImplementedException();
	}
	
	/**
	 * 计算得分
	 * @param v
	 * @return
	 */
	default double calScored(V v) {
		throw new NotImplementedException();
	}
	
	/**
	 * 排行榜更新
	 * @param v
	 * @return  false 没有进入排行榜, true 进入了排行榜并进行了更新
	 */
	default boolean updateRank(V v) {
		throw new NotImplementedException();
	}
	
	
	/**
	 * 排行榜长度
	 * @return
	 */
	default int size() {
		throw new NotImplementedException();
	}
	
	
	
	/**
	 * 分页查询 K  正序
	 * @param page
	 * @param step
	 * @return 返回 k , value 排名
	 */
	default Map<K, RankEntity<K>> rangeUp(int page,int step){
		throw new NotImplementedException();
	}
	
	/**
	 * 分页查询 K 
	 * @param page
	 * @param step
	 * @return 返回 k , value 排名
	 */
	default Map<K, RankEntity<K>> range(int page,int step){
		throw new NotImplementedException();
	}
	
	
	/**
	 * 分页查询 V
	 * @param page
	 * @param step
	 * @return 返回一个有序列表
	 */
	default Map<K, RankEntity<V>> rangeV(int page,int step){
		throw new NotImplementedException();
	}
	
	
	/**
	 * 根据 k 返回实时排名
	 * @param k
	 * @return
	 */
	default RankEntity<V> rankV(K k) {
		throw new NotImplementedException();
	}
	
	/**
	 * 根据 k 返回实时排名
	 * @param k
	 * @return
	 */
	default RankEntity<K> rankK(K k) {
		throw new NotImplementedException();
	}
	
	/**
	 * 获取主键
	 * @param v
	 * @return
	 */
	default K getId(V v) {
		throw new NotImplementedException();
	}
}
